package com.hc.programming.tree;

import java.util.Arrays;

/**
 * 给定二叉搜索树（BST）的根节点 root 和一个整数值 val。
 * 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在，则返回 null 。
 * <p>
 * 示例 1:
 * <a href="./二叉搜索树中的搜索-示例1.png">示例1</a>
 * 输入：root = [4,2,7,1,3], val = 2
 * 输出：[2,1,3]
 * 示例 2:
 * <a href="./二叉搜索树中的搜索-示例2.png">示例2</a>
 * 输入：root = [4,2,7,1,3], val = 5
 * 输出：[]
 * <p>
 * 提示：
 * 树中节点数在 [1, 5000] 范围内
 * 1 <= Node.val <= 10^7
 * root 是二叉搜索树
 * 1 <= val <= 10^7
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/10/15 22:17
 */
public class 二叉搜索树中的搜索 {
    public static void main(String[] args) {
        Integer[] arr = new Integer[]{4, 2, 7, 1, 3};
        TreeNode tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=1,--" + searchBST(tree, 2));
        arr = new Integer[]{4, 2, 7, 1, 3};
        tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=7,--" + searchBST(tree, 5));
    }

    public static TreeNode searchBST(TreeNode root, int val) {
//        return 递归搜索(root, val);

        return 迭代搜索(root, val);
    }

    private static TreeNode 迭代搜索(TreeNode root, int val) {
        while (root != null) {
            if (root.val == val) return root;
            else if (val < root.val) root = root.left;
            else root = root.right;
        }
        return null;
    }

    private static TreeNode 递归搜索(TreeNode root, int val) {
        if (root == null || root.val == val) return root;
        if (val < root.val) return searchBST(root.left, val);
        else return searchBST(root.right, val);
    }
}
